#include "BlockQueue.hpp"
#include "Task.hpp"
#include <unistd.h>

void *PThreadFunc(void *arg) // 生产者
{
    BlockQueue<Task_2> *bq = static_cast<BlockQueue<Task_2> *>(arg);
    while (true)
    {
        std::cout << "生产了一个任务" << std::endl;
        bq->Equeue(Flush);
        sleep(1);
    }
    return nullptr;
}

void *CThreadFunc(void *arg) // 消费者
{
    BlockQueue<Task_2> *bq = static_cast<BlockQueue<Task_2> *>(arg);
    while (true)
    {

        Task_2 t = bq->Pop();
        t(); // 拿到任务执行
    }
    return nullptr;
}

int main()
{
    BlockQueue<Task> bq; // 阻塞队列
    pthread_t p1, c1;

    pthread_create(&p1, nullptr, PThreadFunc, &bq);
    pthread_create(&c1, nullptr, CThreadFunc, &bq);

    pthread_join(p1, nullptr);
    pthread_join(c1, nullptr);

    return 0;
}

/////////////////////////////////////多生产多消费/////////////////////////////////
// #include "BlockQueue.hpp"
// #include "Task.hpp"
// #include <unistd.h>

// void *PThreadFunc(void *arg) // 生产者
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(arg);
//     while (true)
//     {
//         std::cout << "生产了一个任务" << std::endl;
//         bq->Equeue(Flush);
//     }
//     return nullptr;
// }

// void *CThreadFunc(void *arg) // 消费者
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(arg);
//     while (true)
//     {
//         sleep(1);
//         Task t = bq->Pop();
//         t(); // 拿到任务执行
//     }
//     return nullptr;
// }

// int main()
// {
//     BlockQueue<Task> bq; // 阻塞队列
//     pthread_t p1, p2, c1, c2, c3;

//     pthread_create(&p1, nullptr, PThreadFunc, &bq);
//     pthread_create(&p2, nullptr, PThreadFunc, &bq);

//     pthread_create(&c1, nullptr, CThreadFunc, &bq);
//     pthread_create(&c2, nullptr, CThreadFunc, &bq);
//     pthread_create(&c3, nullptr, CThreadFunc, &bq);

//     pthread_join(p1, nullptr);
//     pthread_join(p2, nullptr);
//     pthread_join(c1, nullptr);
//     pthread_join(c2, nullptr);
//     pthread_join(c3, nullptr);

//     return 0;
// }

/////////////////////////////////////////任务形式2////////////////////////////
// #include "BlockQueue.hpp"
// #include "Task.hpp"
// #include <unistd.h>

// void *PThreadFunc(void *arg) // 生产者
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(arg);
//     while (true)
//     {
//         sleep(1);
//         std::cout << "生产了一个任务" << std::endl;
//         bq->Equeue(Flush);
//     }
//     return nullptr;
// }

// void *CThreadFunc(void *arg) // 消费者
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(arg);
//     while (true)
//     {
//         Task t = bq->Pop();
//         t(); // 拿到任务执行
//     }
//     return nullptr;
// }

// int main()
// {
//     BlockQueue<Task> bq; // 阻塞队列
//     pthread_t p_tid, c_tid;
//     pthread_create(&p_tid, nullptr, PThreadFunc, &bq);
//     pthread_create(&c_tid, nullptr, CThreadFunc, &bq);

//     pthread_join(p_tid, nullptr);
//     pthread_join(c_tid, nullptr);

//     return 0;
// }

////////////////////////////////////////////任务形式1///////////////////////////////////////
// void *PThreadFunc(void *arg) // 生产者
// {
//     int x = 1;
//     int y = 1;
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(arg);
//     while (true)
//     {
//         sleep(1);
//         Task t(x, y);
//         std::cout << "生产了一个任务:" << t.DebugToString() << std::endl;
//         bq->Equeue(t);
//         x++, y++;
//     }
//     return nullptr;
// }

// void *CThreadFunc(void *arg) // 消费者
// {
//     BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(arg);
//     while (true)
//     {
//         //sleep(1);
//         Task t = bq->Pop();
//         t.Excute(); // 拿到任务执行
//         std::cout << "完成了一个任务:" << t.ResultToString() << std::endl;
//     }
//     return nullptr;
// }

// int main()
// {
//     BlockQueue<Task> bq; // 阻塞队列
//     pthread_t p_tid, c_tid;
//     pthread_create(&p_tid, nullptr, PThreadFunc, &bq);
//     pthread_create(&c_tid, nullptr, CThreadFunc, &bq);

//     pthread_join(p_tid, nullptr);
//     pthread_join(c_tid, nullptr);

//     return 0;
// }